/**
 * 文件名称: read_config.c
 * 摘    要: linux应用程序下读取配置文件源文件
 * 来    源: https://gengzg.iteye.com/blog/2233719
 *
 * 当前版本: 1.0 
 * 作    者: 
 * 完成日期: 2019年06月13日
 **/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>

#include "read_config.h"


/************************************************************************
函数名称: l_trim
函数功能: 删除左边的空格
函数参数: 
函数返回: 
************************************************************************/
static char *l_trim(char *szOutput, const char *szInput)
{
    assert(szInput != NULL);
    assert(szOutput != NULL);
    assert(szOutput != szInput);
    
    for (NULL; (*szInput != '\0' && isspace(*szInput)); ++szInput);
    {
        ;
    }
    
    return strcpy(szOutput, szInput);
}

/************************************************************************
函数名称: r_trim
函数功能: 删除右边的空格
函数参数: 
函数返回: 
************************************************************************/
static char *r_trim(char *szOutput, const char *szInput)
{
    char *p = NULL;
    assert(szInput != NULL);
    assert(szOutput != NULL);
    assert(szOutput != szInput);
    strcpy(szOutput, szInput);
    for (p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
    {
        ;
    }
    *(++p) = '\0';

    return szOutput;
}

/************************************************************************
函数名称: a_trim
函数功能: 删除两边的空格
函数参数: 
函数返回: 
************************************************************************/
static char *a_trim(char *szOutput, const char *szInput)
{
    char *p = NULL;
    assert(szInput != NULL);
    assert(szOutput != NULL);
    l_trim(szOutput, szInput);
    for (p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
    {
        ;
    }
    *(++p) = '\0';

    return szOutput;
}

/************************************************************************
函数名称: get_profile_string
函数功能: 获取配置文件中的内容
函数参数: profile_name: 配置文件名
          app_name: 配置项名
          key_name: 具体项
          key_value: 获取到的值
函数返回: 成功: 返回0
          失败: 返回-1
************************************************************************/
int get_profile_string(const char *profile_name, const char *app_name, const char *key_name, char *key_value)
{
    char target_app_name[32] = {0}, target_key_name[32] = {0};
    char *buf = NULL, *c = NULL;
    char buf_i[KEYVALLEN] = {0}, buf_o[KEYVALLEN] = {0};
    FILE *fp = NULL;
    int found = 0;      // 1 app_name 2 key_name

    fp = fopen(profile_name, "r");
    if (NULL == fp)
    {
        printf("openfile [%s] error [%s]\n", profile_name, strerror(errno));
        
        return -1;
    }

    fseek(fp, 0, SEEK_SET);
    memset(target_app_name, 0, sizeof(target_app_name));
    sprintf(target_app_name,"[%s]", app_name);

    while ((!feof(fp)) && (NULL != fgets(buf_i, KEYVALLEN, fp)))
    {
        l_trim(buf_o, buf_i);
        if (strlen(buf_o) <= 0)
        {
            continue;
        }
        buf = NULL;
        buf = buf_o;

        if (0 == found)
        {
            if ('[' != buf[0])
            {
                continue;
            }
            else if (0 == strncmp(buf, target_app_name, strlen(target_app_name)))
            {
                found = 1;
                continue;
            }
        }
        else if (1 == found)
        {
            if ('#' == buf[0])
            {
                continue;
            }
            else if ('[' == buf[0])
            {
                break;
            }
            else
            {
                if ((c = (char*)strchr(buf, '=')) == NULL)
                {
                    continue;
                }

                memset(target_key_name, 0, sizeof(target_key_name));
                sscanf(buf, "%[^=|^ |^\t]", target_key_name);

                if (0 == strcmp(target_key_name, key_name))
                {
                    sscanf(++c, "%[^\n]", key_value);
                    char *KeyVal_o = (char *)malloc(strlen(key_value) + 1);
                    if (NULL != KeyVal_o)
                    {
                        memset(KeyVal_o, 0, sizeof(KeyVal_o));
                        a_trim(KeyVal_o, key_value);
                        if (KeyVal_o && (strlen(KeyVal_o) > 0))
                        {
                            strcpy(key_value, KeyVal_o);
                        }
                        free(KeyVal_o);
                        KeyVal_o = NULL;
                    }
                    found = 2;

                    break;
                }
                else
                {
                    continue;
                }
            }
        }
    }

    fclose(fp);

    if (2 == found)
    {
        return 0;
    }
    else
    {
        return -1;
    }
}